from PyQt5.QtWidgets import *      # 导入所需要的view
from PyQt5.QtCore import *         # 导入所需要的model

# tableview是一个二维数据表，那么首先我们需要构建一个二维的数据信息。(而2维数据可以由列表来表示)
headers = ['国家', '感染病例', '死亡病例']
rows = [('美国', 104588, 58955), ('西班牙', 232128, 23822), ('意大利', 201505, 27359)]
# 注意：对数据库中的数据进行查询和插入的操作时，我们都是以元组的形式传递数据的

# 接下来我们要把上面的数据添加到model当中（或者叫 将数据和model绑定）
# 并且现在的数据是自定义的，那么对应的model也需要自己设置


# 自定义TableModel（理由：数据源是自定义，那么对应的model就需要自定义）
class TableModel(QAbstractTableModel):
    # 由于QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel都是与数据相关的，
    # 而我们现在不需要连接数据库，所以就要继承他们共同的父类：QAbstractTableModel
    # 这样做的目的是，再继承了父类model的一些基础方法外，我们可以自定义一些方法。

    # 二维数据，需要对应的行数、列数
    # 返回行数（方法）
    def rowCount(self, parent) -> int:
        return len(rows)
    # 补充说明： 定义方法的时候其中的 ‘->’ 表示返回值（类型）

    # 返回列数（方法）
    def columnCount(self, parent=None, *args, **kwargs) -> int:
        return len(headers)      # 表头决定了多少列

    # 数据内容
    def data(self, index: QModelIndex, role: int = ...):
        if role != Qt.DisplayRole:
            return QVariant()
        return rows[index.row()][index.column()]

    # 表头
    def headerData(self, section, orientation: Qt.Orientation, role=None):
        # 由于参数中的role=None 如果不加以处理，则不会显示表头
        if role != Qt.DisplayRole or orientation != Qt.Horizontal:
            # 如果role不是Qt.DisplayRole 或者 方向orientation 不是 Qt.Horizontal（水平）
            return QVariant()
        return headers[section]

    # 总的来说，一个表格主要设置四部分内容：函行数、列数、表头、表格内容


# 测试程序
app = QApplication([])
model = TableModel()
view = QTableView()
view.setModel(model)      # 将view与model绑定起来
view.show()
app.exec_()